package com.zhuguang.jack.aop.aspect;

import com.zhuguang.jack.annotation.TargetMethod;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Service;

@Service   //首先要是一个bean，然后再是反射拿到Aspect注解。
@Aspect
public class AspectAnnotation {//注解针对的是spring所有的bean。只要满足注解条件。

    @Pointcut("execution(public * com.zhuguang.jack.service.*.*(..))")  
    //拦截的方法：com.zhuguang.jack.service.*.*  包下的任意方法。
    //（一个类的接口在这个包下面，实现类不在这个包下面，也属于条件符合）（实现类在这个包下面，接口不在这个包下面，也属于符合条件）
    public void pc1(){}

    @Before("pc1()")
    public void beforeee(JoinPoint joinPoint) {
        System.out.println("==============beforeee 前置通知=========");
    }

    @After("pc1()")
    public void afterrr(JoinPoint joinPoint) {
        System.out.println("==============afterrr 后置通知=========");
    }

    @Around("pc1()")
    public void arounddd(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("==============arounddd  前置通知=========");
        joinPoint.proceed();
        System.out.println("==============arounddd  后置通知=========");
    }

    @Before(value = "@annotation(targetMethod)",argNames = "joinPoint,targetMethod")  
    //拦截的方法要有@TargetMethod注解。不看包是否满足条件了。
    public void xx(JoinPoint joinPoint, TargetMethod targetMethod) {
        System.out.println("===============注解拦截 前置通知xx=========");
        System.out.println("==================targetMethod.name = " + targetMethod.name());
    }

    @Before(value = "pc1() && @annotation(targetMethod)",argNames = "joinPoint,targetMethod")
    public void aa(JoinPoint joinPoint,TargetMethod targetMethod) {
        System.out.println("===============注解拦截 前置通知aa=========");
        System.out.println("==================targetMethod.name = " + targetMethod.name());
    }
}
